package com.zwh.algorithm.leetcode.medium;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class LeetCode2178 {
    /**
     * 2023-07-06  拆分成最多数目的正偶数之和
     * todo 给你一个整数 finalSum 。请你将它拆分成若干个 互不相同 的正偶数之和，且拆分出来的正偶数数目 最多 。
     * todo 比方说，给你finalSum = 12，那么这些拆分是符合要求 的（互不相同的正偶数且和为finalSum）：(2 + 10)，(2 + 4 + 6)和(4 + 8)。
     * todo 它们中，(2 + 4 + 6)包含最多数目的整数。注意finalSum不能拆分成(2 + 2 + 4 + 4)，因为拆分出来的整数必须互不相同。
     * todo 请你返回一个整数数组，表示将整数拆分成 最多 数目的正偶数数组。如果没有办法将finalSum进行拆分，请你返回一个空数组。
     * todo 你可以按 任意顺序返回这些整数。
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(maximumEvenSplit(14));
    }

    /**
     * 方法一：贪心
     * 首先，如果finalSum 为奇数，那么无法拆分为若干偶数，我们返回空数组即可。
     * 其次，我们希望拆分成尽可能多的偶数，我们应该尽可能拆份成最小的若干个偶数。
     * 从最小的偶整数2开始依次尝试拆分，直到剩余的数值小于等于当前被拆分的最大偶整数为止。
     * 此时，我们已经拆分成尽可能多的偶数，不可能拆分出更多的互不相同的偶数。
     * 如果此时拆分后剩余的finalSum 大于零，则将这个数值加到最大的偶整数上，从而保证所有的数互不相同。
     * @param finalSum
     * @return
     */
    public static List<Long> maximumEvenSplit(long finalSum) {
        List<Long> res = new ArrayList<>();
        if (finalSum % 2 > 0) {
            return res;
        }
        for (long i = 2; i <= finalSum; i += 2) {
            res.add(i);
            finalSum -= i;
        }
        res.set(res.size() - 1,res.get(res.size() - 1)+finalSum);
        return res;
    }
}
